package net.wanho.controller;

import cn.hutool.core.util.IdUtil;
import lombok.RequiredArgsConstructor;
import net.wanho.util.LockUtil;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Author：汤小洋
 * Date：2024-01-03 11:17
 * Description：<描述>
 */
@RestController
@RequiredArgsConstructor
public class LockController {

    private final StringRedisTemplate redisTemplate;
    private final RedissonClient redissonClient;

    /**
     * 单体锁
     */
    // @RequestMapping("/deductStock")
    // public String deductStock(){
    //     System.out.println(Thread.currentThread().getName()+"线程正在下单。。。。。。。。。。。。。。。。。");
    //
    //     synchronized (this) {
    //         int total = Integer.parseInt(redisTemplate.opsForValue().get("stock"));
    //         if(total > 0){
    //             try {
    //                 Thread.sleep(5000);
    //             } catch (InterruptedException e) {
    //                 throw new RuntimeException(e);
    //             }
    //             total = total - 1;
    //             redisTemplate.opsForValue().set("stock", String.valueOf(total));
    //             return "下单成功，库存还剩余：" + total;
    //         }
    //     }
    //     return "下单失败，库存不足！";
    // }

    /**
     * 分布式锁
     */
    @RequestMapping("/deductStock")
    public String deductStock(){
        System.out.println(Thread.currentThread().getName()+"线程正在下单。。。。。。。。。。。。。。。。。");

        String lockName = "stock_lock"; // 锁的名称
        // String value = IdUtil.simpleUUID(); // 锁的值

        // if (!LockUtil.getLock(lockName, value)){
        //     return "获取锁失败!";
        // }
        RLock rLock = redissonClient.getLock(lockName);
        rLock.lock(); // 加锁，默认锁的超时时间为30s

        int total = Integer.parseInt(redisTemplate.opsForValue().get("stock"));
        if(total > 0){
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            total = total - 1;
            redisTemplate.opsForValue().set("stock", String.valueOf(total));

            // LockUtil.unlock(lockName, value); // 释放锁
            rLock.unlock(); // 释放锁
            return "下单成功，库存还剩余：" + total;
        }

        // LockUtil.unlock(lockName, value); // 释放锁
        rLock.unlock(); // 释放锁
        return "下单失败，库存不足！";
    }


}
